組件實作 : Demo
在行動裝置當道的時代,網頁的版面也隨著手機出現而有所改變,為了符合各種裝置較好的閱讀體驗,RWD 技術【1】也隨之誕生。我們今天要使用 CSS 的 Media queries
【2】來實作一個瀑布流排版,規劃如下:在桌機會以 4 欄布局呈現,切換到平板變成 2 欄布局,而在手機上則是單欄佈局的版面。
我們知道最簡單的圖片排版,只要將圖片的寬度設定為100%
,圖片的寬度就會隨著螢幕大小縮放,寫法可以像是:
CSS:
.rwd__img {
width: 100%;
max-width: 500px;
height: auto;
}
這樣寫可以做出簡單的圖片RWD【3】。接下來,我們要來做一個圖片的瀑布流排版。
首先,先用一個 Class 名稱為rows
的 div,裡面加入 Class 名稱為column
的 div,column
裡面再包住你要的圖片元素img
。
HTML:
<div class="rows">
<div class="column">
<img src="https://source.unsplash.com/random/600x400?sig=1" />
</div>
column 裡面圖片根據需求來存放照片張數,照片會以直排顯示。在 rows 裡面可以放入多個 column 來當作欄數,因為我們最多要在桌機上顯示 4 個欄位,全部程式碼架構如下。
HTML:
<div class="rows">
<div class="column">
<img src="https://source.unsplash.com/random/600x400?sig=1" />
<img src="https://source.unsplash.com/random/600x400?sig=2" />
<img src="https://source.unsplash.com/random/600x800?sig=3" />
<img src="https://source.unsplash.com/random/600x400?sig=4" />
<img src="https://source.unsplash.com/random/600x400?sig=5" />
<img src="https://source.unsplash.com/random/600x1000?sig=6" />
<img src="https://source.unsplash.com/random/600x400?sig=7" />
<img src="https://source.unsplash.com/random/600x400?sig=8" />
<img src="https://source.unsplash.com/random/600x100?sig=9" />
<img src="https://source.unsplash.com/random/600x400?sig=10" />
</div>
<div class="column">
<img src="https://picsum.photos/300/300?random=1" />
<img src="https://picsum.photos/600/200?random=2" />
<img src="https://picsum.photos/600/400?random=3" />
<img src="https://picsum.photos/600/400?random=4" />
<img src="https://picsum.photos/600/300?random=5" />
<img src="https://picsum.photos/600/400?random=6" />
<img src="https://picsum.photos/600/400?random=7" />
<img src="https://picsum.photos/600/400?random=8" />
<img src="https://picsum.photos/600/400?random=9" />
<img src="https://picsum.photos/600/400?random=10" />
</div>
<div class="column">
<img src="https://picsum.photos/600/400?random=11" />
<img src="https://picsum.photos/600/200?random=12" />
<img src="https://picsum.photos/600/400?random=13" />
<img src="https://picsum.photos/600/800?random=14" />
<img src="https://picsum.photos/600/400?random=15" />
<img src="https://picsum.photos/600/400?random=16" />
<img src="https://picsum.photos/600/400?random=17" />
<img src="https://picsum.photos/600/400?random=18" />
<img src="https://picsum.photos/600/400?random=19" />
<img src="https://picsum.photos/600/400?random=20" />
</div>
<div class="column">
<img src="https://picsum.photos/600/400?random=21" />
<img src="https://picsum.photos/600/800?random=22" />
<img src="https://picsum.photos/600/400?random=23" />
<img src="https://picsum.photos/600/400?random=24" />
<img src="https://picsum.photos/600/400?random=25" />
<img src="https://picsum.photos/600/400?random=26" />
<img src="https://picsum.photos/600/400?random=27" />
<img src="https://picsum.photos/600/400?random=28" />
<img src="https://picsum.photos/600/800?random=29" />
<img src="https://picsum.photos/600/400?random=30" />
</div>
</div>
我們要先做手機的排版,把rows
的display
設定為 flex
,這樣不管在哪種螢幕寬度上,預設都是會橫排,flex-wrap
設定為wrap
則是超過父層寬度時會自動換行。在img
設定上,我們讓圖片可以自動縮放,只需設定width:100%;
即可,而vertical-align
設定成middle
則是為了解決圖片底部可能出現白邊的問題。
CSS:
.rows {
display: flex;
flex-wrap: wrap;
}
.rows img {
width: 100%;
vertical-align: middle;
margin-top: 8px;
}
顯示結果:
在手機排版會式單欄的排版效果。圖片的高度主要來自於圖片本身,高度經由縮放比例而隨之變動,接著重頭戲我們要來處理 RWD 切換的排版,我常用的 RWD 模板(Media queries)長這樣。
CSS:
@media (min-width: 575.98px) { }
@media (min-width: 767.98px) { }
@media (min-width: 991.98px) { }
@media (min-width: 1199.98px) { }
@media (min-width: 1399.98px) { }
因為我們是以 mobile first,所以用min-width
來判斷裝置的寬度,min-width 指的是最小以上
,使用數值對應如下:
575.98px
:手機直屏767.98px
:手機橫屏991.98px
:平板直屏1199.98px
:平板橫屏1399.98px
:桌機這些數值參考 Bootstrap 5 的寫法【4】。
@media (min-width: 767.98px) {
.column {
flex: 50%;
max-width: 50%;
padding: 0 4px;
}
}
@media (min-width: 1199.98px) {
.rows {
justify-content: center;
}
.column {
flex: 25%;
padding: 0 4px;
max-width: 300px;
}
}
顯示結果:
我們發現大於 767.98px
時,圖片沒有正常的顯示,這就代表圖片寬度超出了container
的寬度,這時將box-sizing
設定成border-box
,這樣寫可以讓border
和padding
不會額外的增加空間,此時圖片就能夠正常的排版。
CSS:
* {
font-family: Arial;
text-align: center;
box-sizing: border-box;
}
我們在 CSS 順便設定font-family
字型,以及在 HTML 補上一些文字。
HTML:
<h2>Responsive Image Grid</h2>
<h4>Resize the browser window to see the responsive effect.</h4>
顯示結果:
4欄
2欄
單欄
如果圖片的寬高都一樣,display
可以使用grid
來做,會做出很整齊、漂亮的版面。但是要用 Grid 做成瀑布流的排版,目前沒有找到最佳的解法【6】,有機會再深入研究。另外,瀑布流的排版方式,其實可以添加一些動畫特效,讓畫面更有互動性,那麼今天介紹就到這邊,感謝收看!